package com.keensense.vcm.model;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import com.keensense.vcm.model.enums.OTypeEnum;
import com.keensense.vcm.model.enums.SearchTypeEnum;

/**
 * @author lanjian
 * @date 2020/4/29 12:59 下午
 */
@XmlRootElement(name = "request")
public class PeopleFaceSearchRequest {

    /**
     * 起始时间，时间戳，例如1507729126653，起始时间不晚于结束时间，时间最长间隔默认365天，当采用分时间段检索时，此字段设置为0。
     */
    @XmlElement
    private long startTime;

    /**
     * 结束时间，时间戳，例如1507729126653，起始时间不晚于结束时间，时间最长间隔默认365天，当采用分时间段检索时，此字段设置为0。
     */
    @XmlElement
    private long endTime;

    /**
     * 检索类型（人脸检索时输入0，人体检索时输入1）
     */
    @XmlElement
    private SearchTypeEnum searchType;

    /**
     * 摄像机编号列表，输入图片时必须输入摄像机编码或者历史文件id，二者不能同时输入
     */
    @XmlElementWrapper(name = "cameraSns")
    @XmlElement(name = "cameraSn")
    private List<String> cameraSns;

    /**
     * 历史文件id列表，输入图片时必须输入摄像机编码或者历史文件id，二者不能同时输入
     */
    @XmlElementWrapper(name = "historyFileIds")
    @XmlElement(name = "historyFileId")
    private List<String> historyFileIds;

    /**
     * 图片id列表
     */
    @XmlElementWrapper(name = "fileIds")
    @XmlElement(name = "fileId")
    private List<String> fileIds;

    /**
     * 图片id列表
     */
    @XmlElementWrapper(name = "pictures")
    @XmlElement(name = "picture")
    private List<Picture> pictures;

    /**
     * 是否有特征值（-1：不限，0：无，1：有）
     */
    @XmlElement
    private Integer feature;

    /**
     * 性别（-1不限，0未知，1男，2女）
     */
    @XmlElement
    private Integer gender;

    /**
     * 年龄值范围最大值 检索类型为人脸结构化检索时有效
     */
    @XmlElement
    private String ageBegin;

    /**
     * 年龄值范围最大值 检索类型为人脸结构化检索时有效
     */
    @XmlElement
    private String ageEnd;

    /**
     * 民族 0:未知 其他数值：按国标GBT3304-1991中数字代码的有效位定义，如汉族01，有效位为1； 检索类型为人脸结构化检索时有效
     */
    @XmlElement
    private String nation;

    /**
     * 年龄（-1不限，0未知，1儿童，2少年，3青年，4中年，5老年） 检索类型为人体结构化检索时有效
     */
    @XmlElement
    private Integer age;

    /**
     * 上衣颜色（-1不限，0未知，1黑，2绿，3蓝，4白/灰，5黄/橙/棕，6红/粉/紫） 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer upperColor;

    /**
     * 下衣颜色（-1不限，0未知，1黑，2绿，3蓝，4白/灰，5黄/橙/棕，6红/粉/紫） 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer lowerColor;

    /**
     * 上衣款式（-1不限，0未知，1长袖，2短袖） 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer upperStyle;

    /**
     * 下衣款式（-1不限，0未知，1长裤，2短裤，3裙子）检索类型为人体检索时有效
     */
    @XmlElement
    private Integer lowerStyle;

    /**
     * 上衣纹理（-1不限，0未知，1纯色，2横条，3竖条，4格子，5花纹，6条纹，7拼接） 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer upperTexture;

    /**
     * 背包, 仅在人体检索时返回 -1 不限0未知1有2无检索类型为人体检索时有效
     */
    @XmlElement
    private Integer backpack;

    /**
     * 手提包, 仅在人体检索时返回 -1 不限0未知1有2无检索类型为人体检索时有效
     */
    @XmlElement
    private Integer handbag;

    /**
     * 算法代码。如果不填写，系统会使用默认的一种算法进行搜索。
     */
    @XmlElement
    private String algorithmCode;

    /**
     * 眼镜 -1不限0未知1有2无
     */
    @XmlElement
    private Integer eyeglass;

    /**
     * 口罩 -1不限0未知1有2无
     */
    @XmlElement
    private Integer mouthmask;

    /**
     * 帽子 -1不限0未知1有2无
     */
    @XmlElement
    private Integer hat;

    /**
     * 方向 -1 不限0未知1向前2向后3向左4向右检索类型为人体检索时有效
     */
    @XmlElement
    private Integer view;

    /**
     * 发型 -1 不限0未知1长发2短发3马尾 4盘发检索类型为人体检索时有效
     */
    @XmlElement
    private Integer hair;

    /**
     * 雨伞 -1 不限0未知1有2无 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer umbrella;

    /**
     * 头盔 -1 不限0未知1有2无 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer helmet;

    /**
     * 头盔颜色 -1 不限0未知1黑2绿3蓝4白/灰5黄/橙/棕6红/紫/粉 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer helmetColor;

    /**
     * 非机动车类型 -1 不限0未知1二轮车2三轮车 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer bicycleTricycle;

    /**
     * 非机动车颜色 -1 不限0未知1黑2绿3蓝4白/灰5黄/橙/棕6红/紫/粉 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer cycleColor;

    /**
     * 斜挎包 -1 不限0未知1有2无检索类型为人体检索时有效
     */
    @XmlElement
    private Integer messengerBag;

    /**
     * 体型 -1:不限0:未知1:胖2:瘦3:正常 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer shape;

    /**
     * 胡须 -1不限 0未知 1有 2无 检索类型为人脸检索时有效
     */
    @XmlElement
    private Integer mustache;

    /**
     * 肤色 -1：不限 0：未知 1：黄 2：黑 3：白 4：棕 检索类型为人脸检索时有效
     */
    @XmlElement
    private Integer skinColor;

    /**
     * 表情 -1：不限 0：未知 1：微笑 2：愤怒 3：悲伤 4：正常 5：惊讶 检索类型为人脸检索时有效
     */
    @XmlElement
    private Integer expression;

    /**
     * 怀抱物 -1:不限 0：未知 1：有 2：无 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer frontpack;

    /**
     * 行李箱 -1：不限 0：未知 1：有 2：无 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer luggage;

    /**
     * 非机动车车棚 -1：不限 0：未知 1：有 2：无 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer sunshade;

    /**
     * 车棚颜色 -1：不限 0：未知 1：黑 2：绿 3：蓝 4：白/灰 5：黄/橙/棕 6：红/粉/紫 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer sunshadeColor;

    /**
     * 吸烟 -1：不限 0：未知 1：有 2：无 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer smoking;

    /**
     * 打电话 -1：不限 0：未知 1：有 2：无
     */
    @XmlElement
    private Integer calling;

    /**
     * 车尾箱 -1：不限 0：未知 1：有 2：无 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer tailBox;

    /**
     * 超载 -1：不限 0：未知 1：载人 2：未载人 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer overload;

    /**
     * 非机动车车牌 -1:不限0:未知1:有2:没有 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer bikeHasPlate;

    /**
     * 车灯形状 -1:不限0:未知1:三角形2:圆形3:菱形 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer headLightShape;

    /**
     * 非机动车子类 -1:不限0:未知1:自行车2:两轮摩托车3:电动车100:三轮摩托车 检索类型为人体检索时有效
     */
    @XmlElement
    private Integer subBicycleTricycle;

    /**
     * 时间范围限制
     */
    @XmlElement
    private Long timeRangeLimit;

    /**
     * 目标类型（-1不限，0：未知、1:机动车、2:非机动车、3:人脸、4:人体、5：骑行人、6：其他） 检索类型为人体检索时有效
     */
    @XmlElement
    private OTypeEnum otype;

    /**
     * 相似度阈值（取值范围0~100） 带图片检索时有效
     */
    @XmlElement
    private Integer confidenceThreshold;

    /**
     * 图片检索时决定是否过滤红名单，该字段只针对有红名单权限的用户有效，无红名单权限的用户默认过滤红名单。取值：true或false，默认为false
     */
    @XmlElement
    private Boolean filterOptions;

    @XmlElementWrapper(name = "domainCodes")
    @XmlElement(name = "domainCode")
    private List<String> domainCodes;

    @XmlElement
    private boolean archivesOptions;

    /**
     * 分页信息
     */
    @XmlElement
    private PageModel page;

    private PeopleFaceSearchRequest() {

    }

    public PeopleFaceSearchRequest(long startTime, long endTime, SearchTypeEnum searchType, PageModel page) {
        this.startTime = startTime;
        this.endTime = endTime;
        this.searchType = searchType;
        this.page = page;
    }

    public void setStartTime(long startTime) {
        this.startTime = startTime;
    }

    public void setEndTime(long endTime) {
        this.endTime = endTime;
    }

    public void setSearchType(SearchTypeEnum searchType) {
        this.searchType = searchType;
    }

    public void setPage(PageModel page) {
        this.page = page;
    }

    public void setCameraSns(List<String> cameraSns) {
        this.cameraSns = cameraSns;
    }

    public void setHistoryFileIds(List<String> historyFileIds) {
        this.historyFileIds = historyFileIds;
    }

    public void setFileIds(List<String> fileIds) {
        this.fileIds = fileIds;
    }

    public void setPictures(List<Picture> pictures) {
        this.pictures = pictures;
    }

    public void setFeature(Integer feature) {
        this.feature = feature;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public void setAgeBegin(String ageBegin) {
        this.ageBegin = ageBegin;
    }

    public void setAgeEnd(String ageEnd) {
        this.ageEnd = ageEnd;
    }

    public void setNation(String nation) {
        this.nation = nation;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setUpperColor(Integer upperColor) {
        this.upperColor = upperColor;
    }

    public void setLowerColor(Integer lowerColor) {
        this.lowerColor = lowerColor;
    }

    public void setUpperStyle(Integer upperStyle) {
        this.upperStyle = upperStyle;
    }

    public void setLowerStyle(Integer lowerStyle) {
        this.lowerStyle = lowerStyle;
    }

    public void setUpperTexture(Integer upperTexture) {
        this.upperTexture = upperTexture;
    }

    public void setBackpack(Integer backpack) {
        this.backpack = backpack;
    }

    public void setHandbag(Integer handbag) {
        this.handbag = handbag;
    }

    public void setAlgorithmCode(String algorithmCode) {
        this.algorithmCode = algorithmCode;
    }

    public void setEyeglass(Integer eyeglass) {
        this.eyeglass = eyeglass;
    }

    public void setMouthmask(Integer mouthmask) {
        this.mouthmask = mouthmask;
    }

    public void setHat(Integer hat) {
        this.hat = hat;
    }

    public void setView(Integer view) {
        this.view = view;
    }

    public void setHair(Integer hair) {
        this.hair = hair;
    }

    public void setUmbrella(Integer umbrella) {
        this.umbrella = umbrella;
    }

    public void setHelmet(Integer helmet) {
        this.helmet = helmet;
    }

    public void setHelmetColor(Integer helmetColor) {
        this.helmetColor = helmetColor;
    }

    public void setBicycleTricycle(Integer bicycleTricycle) {
        this.bicycleTricycle = bicycleTricycle;
    }

    public void setCycleColor(Integer cycleColor) {
        this.cycleColor = cycleColor;
    }

    public void setMessengerBag(Integer messengerBag) {
        this.messengerBag = messengerBag;
    }

    public void setShape(Integer shape) {
        this.shape = shape;
    }

    public void setMustache(Integer mustache) {
        this.mustache = mustache;
    }

    public void setSkinColor(Integer skinColor) {
        this.skinColor = skinColor;
    }

    public void setExpression(Integer expression) {
        this.expression = expression;
    }

    public void setFrontpack(Integer frontpack) {
        this.frontpack = frontpack;
    }

    public void setLuggage(Integer luggage) {
        this.luggage = luggage;
    }

    public void setSunshade(Integer sunshade) {
        this.sunshade = sunshade;
    }

    public void setSunshadeColor(Integer sunshadeColor) {
        this.sunshadeColor = sunshadeColor;
    }

    public void setSmoking(Integer smoking) {
        this.smoking = smoking;
    }

    public void setCalling(Integer calling) {
        this.calling = calling;
    }

    public void setTailBox(Integer tailBox) {
        this.tailBox = tailBox;
    }

    public void setOverload(Integer overload) {
        this.overload = overload;
    }

    public void setBikeHasPlate(Integer bikeHasPlate) {
        this.bikeHasPlate = bikeHasPlate;
    }

    public void setHeadLightShape(Integer headLightShape) {
        this.headLightShape = headLightShape;
    }

    public void setSubBicycleTricycle(Integer subBicycleTricycle) {
        this.subBicycleTricycle = subBicycleTricycle;
    }

    public void setTimeRangeLimit(Long timeRangeLimit) {
        this.timeRangeLimit = timeRangeLimit;
    }

    public void setOtype(OTypeEnum otype) {
        this.otype = otype;
    }

    public void setConfidenceThreshold(int confidenceThreshold) {
        this.confidenceThreshold = confidenceThreshold;
    }

    public void setFilterOptions(Boolean filterOptions) {
        this.filterOptions = filterOptions;
    }

    public void setDomainCodes(List<String> domainCodes) {
        this.domainCodes = domainCodes;
    }

    @XmlTransient
    public long getStartTime() {
        return startTime;
    }

    @XmlTransient
    public long getEndTime() {
        return endTime;
    }

    @XmlTransient
    public boolean isArchivesOptions() {
        return archivesOptions;
    }
    
    public void setArchivesOptions(boolean archivesOptions) {
        this.archivesOptions = archivesOptions;
    }
}
